#!/bin/bash

# 文件描述符监控脚本
# 用于检测服务器运行时的文件描述符泄漏

echo "======================================"
echo "文件描述符监控工具"
echo "======================================"

# 检查系统限制
echo -e "\n[系统限制]"
echo "当前用户最大文件描述符数: $(ulimit -n)"
echo "系统级最大文件描述符数: $(cat /proc/sys/fs/file-max)"

# 等待服务器启动
echo -e "\n请在另一个终端启动服务器，然后回车继续..."
read

# 查找服务器进程
SERVER_PID=$(pgrep server_test)

if [ -z "$SERVER_PID" ]; then
    echo "错误: 未找到 server_test 进程"
    exit 1
fi

echo "找到服务器进程 PID: $SERVER_PID"
echo -e "\n开始监控文件描述符使用情况 (Ctrl+C 退出)..."
echo "时间              | FD数量 | TCP连接数 | 监听套接字 | EventFD | 其他"
echo "--------------------------------------------------------------------------------"

# 持续监控
while true; do
    if ! kill -0 $SERVER_PID 2>/dev/null; then
        echo -e "\n服务器进程已终止"
        break
    fi

    # 统计各类文件描述符
    FD_COUNT=$(ls /proc/$SERVER_PID/fd 2>/dev/null | wc -l)
    TCP_COUNT=$(lsof -p $SERVER_PID 2>/dev/null | grep TCP | grep -v LISTEN | wc -l)
    LISTEN_COUNT=$(lsof -p $SERVER_PID 2>/dev/null | grep TCP | grep LISTEN | wc -l)
    EVENTFD_COUNT=$(lsof -p $SERVER_PID 2>/dev/null | grep eventfd | wc -l)
    OTHER_COUNT=$((FD_COUNT - TCP_COUNT - LISTEN_COUNT - EVENTFD_COUNT))

    # 获取当前时间
    TIMESTAMP=$(date "+%H:%M:%S")

    # 输出统计信息
    printf "%-17s | %-6d | %-9d | %-10d | %-7d | %-4d\n" \
        "$TIMESTAMP" "$FD_COUNT" "$TCP_COUNT" "$LISTEN_COUNT" "$EVENTFD_COUNT" "$OTHER_COUNT"

    # 检查是否接近限制
    ULIMIT=$(ulimit -n)
    if [ $FD_COUNT -gt $((ULIMIT * 80 / 100)) ]; then
        echo "⚠️  警告: 文件描述符使用已超过限制的80% ($FD_COUNT/$ULIMIT)"
    fi

    sleep 1
done

echo -e "\n监控结束"
